package com.kexio.config.service;

import java.util.List;
import java.util.Map;

import com.kexio.common.dto.Result;
import com.kexio.config.entity.SystemConfig;

/**
 * 配置服务接口
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
public interface ConfigService {
    
    /**
     * 获取字符串配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getString(String key, String defaultValue);
    
    /**
     * 获取整数配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Integer getInteger(String key, Integer defaultValue);
    
    /**
     * 获取布尔配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Boolean getBoolean(String key, Boolean defaultValue);
    
    /**
     * 获取长整数配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Long getLong(String key, Long defaultValue);
    
    /**
     * 获取双精度配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Double getDouble(String key, Double defaultValue);
    
    /**
     * 获取JSON配置值 (自动解析为对象)
     * 
     * @param key 配置键
     * @param clazz 目标类型
     * @param defaultValue 默认值
     * @return 配置值
     */
    <T> T getObject(String key, Class<T> clazz, T defaultValue);
    
    /**
     * 获取配置值 (原始字符串)
     * 
     * @param key 配置键
     * @return 配置值
     */
    String getRawValue(String key);
    
    /**
     * 设置配置值
     * 
     * @param key 配置键
     * @param value 配置值
     * @return 设置结果
     */
    Result<Boolean> setConfig(String key, String value);
    
    /**
     * 设置配置值 (带修改人)
     * 
     * @param key 配置键
     * @param value 配置值
     * @param modifier 修改人
     * @return 设置结果
     */
    Result<Boolean> setConfig(String key, String value, String modifier);
    
    /**
     * 批量设置配置
     * 
     * @param configs 配置集合
     * @param modifier 修改人
     * @return 设置结果
     */
    Result<Boolean> batchSetConfig(Map<String, String> configs, String modifier);
    
    /**
     * 删除配置
     * 
     * @param key 配置键
     * @return 删除结果
     */
    Result<Boolean> deleteConfig(String key);
    
    /**
     * 检查配置是否存在
     * 
     * @param key 配置键
     * @return 是否存在
     */
    boolean exists(String key);
    
    /**
     * 获取配置实体
     * 
     * @param key 配置键
     * @return 配置实体
     */
    SystemConfig getConfigEntity(String key);
    
    /**
     * 保存配置实体
     * 
     * @param config 配置实体
     * @return 保存结果
     */
    Result<SystemConfig> saveConfig(SystemConfig config);
    
    /**
     * 根据类型获取配置列表
     * 
     * @param configType 配置类型
     * @return 配置列表
     */
    List<SystemConfig> getConfigsByType(String configType);
    
    /**
     * 根据分组获取配置列表
     * 
     * @param configGroup 配置分组
     * @return 配置列表
     */
    List<SystemConfig> getConfigsByGroup(String configGroup);
    
    /**
     * 获取所有配置 (用于管理界面)
     * 
     * @return 配置列表
     */
    List<SystemConfig> getAllConfigs();
    
    /**
     * 搜索配置
     * 
     * @param keyword 关键字
     * @return 配置列表
     */
    List<SystemConfig> searchConfigs(String keyword);
    
    /**
     * 刷新配置缓存
     * 
     * @return 刷新结果
     */
    Result<Boolean> refreshCache();
    
    /**
     * 刷新指定配置的缓存
     * 
     * @param key 配置键
     * @return 刷新结果
     */
    Result<Boolean> refreshCache(String key);
    
    /**
     * 获取配置统计信息
     * 
     * @return 统计信息
     */
    Map<String, Object> getConfigStatistics();
    
    /**
     * 导出配置
     * 
     * @param configType 配置类型 (可选)
     * @return 配置数据
     */
    List<SystemConfig> exportConfigs(String configType);
    
    /**
     * 导入配置
     * 
     * @param configs 配置列表
     * @param override 是否覆盖现有配置
     * @return 导入结果
     */
    Result<Integer> importConfigs(List<SystemConfig> configs, boolean override);
    
    /**
     * 验证配置值格式
     * 
     * @param key 配置键
     * @param value 配置值
     * @return 验证结果
     */
    Result<Boolean> validateConfigValue(String key, String value);
    
    /**
     * 重置配置为默认值
     * 
     * @param key 配置键
     * @return 重置结果
     */
    Result<Boolean> resetToDefault(String key);
}
